BroadwayInputBaseMsg base;
guint32 width;
guint32 height;
+ guint32 scale;
} BroadwayInputScreenResizeNotify;
typedef struct {
guint32 next_texture_id;
GHashTable *textures;
- guint32 screen_width;
- guint32 screen_height;
+ guint32 screen_scale;
gint32 mouse_in_surface_id;
int last_x, last_y; /* in root coords */
root->visible = TRUE;
server->root = root;
+ server->screen_scale = 1;
g_hash_table_insert (server->surface_id_hash,
GINT_TO_POINTER (root->id),
case BROADWAY_EVENT_SCREEN_SIZE_CHANGED:
server->root->width = message->screen_resize_notify.width;
server->root->height = message->screen_resize_notify.height;
+ server->screen_scale = message->screen_resize_notify.scale;
break;
default:
case BROADWAY_EVENT_SCREEN_SIZE_CHANGED:
msg.screen_resize_notify.width = ntohl (*p++);
msg.screen_resize_notify.height = ntohl (*p++);
+ msg.screen_resize_notify.scale = ntohl (*p++);
break;
default:
void
broadway_server_get_screen_size (BroadwayServer *server,
guint32 *width,
- guint32 *height)
+ guint32 *height,
+ guint32 *scale)
{
*width = server->root->width;
*height = server->root->height;
+ *scale = server->screen_scale;
}
static void
guint32 tag);
void broadway_server_get_screen_size (BroadwayServer *server,
guint32 *width,
- guint32 *height);
+ guint32 *height,
+ guint32 *scale);
guint32 broadway_server_get_next_serial (BroadwayServer *server);
guint32 broadway_server_get_last_seen_time (BroadwayServer *server);
gboolean broadway_server_lookahead_event (BroadwayServer *server,
}
}
+function sendScreenSizeChanged() {
+ var w, h, s;
+ w = window.innerWidth;
+ h = window.innerHeight;
+ s = Math.round(window.devicePixelRatio);
+ sendInput (BROADWAY_EVENT_SCREEN_SIZE_CHANGED, [w, h, s]);
+}
+
function start()
{
setupDocument(document);
- var w, h;
- w = window.innerWidth;
- h = window.innerHeight;
window.onresize = function(ev) {
- var w, h;
- w = window.innerWidth;
- h = window.innerHeight;
- sendInput (BROADWAY_EVENT_SCREEN_SIZE_CHANGED, [w, h]);
+ sendScreenSizeChanged();
};
- sendInput (BROADWAY_EVENT_SCREEN_SIZE_CHANGED, [w, h]);
+ window.matchMedia('screen and (min-resolution: 2dppx)').
+ addListener(function(e) {
+ if (e.matches) {
+ /* devicePixelRatio >= 2 */
+ sendScreenSizeChanged();
+ } else {
+ /* devicePixelRatio < 2 */
+ sendScreenSizeChanged();
+ }
+ });
+ sendScreenSizeChanged();
}
function connect()
ev.base.time = broadway_server_get_last_seen_time (server);
broadway_server_get_screen_size (server,
&ev.screen_resize_notify.width,
- &ev.screen_resize_notify.height);
+ &ev.screen_resize_notify.height,
+ &ev.screen_resize_notify.scale);
broadway_events_got_input (&ev,
client->id);
NULL);
gdk_monitor_set_manufacturer (display->monitor, "browser");
gdk_monitor_set_model (display->monitor, "0");
+ display->scale_factor = 1;
+ gdk_monitor_set_size (display->monitor, 1024, 768);
+ gdk_monitor_set_physical_size (display->monitor, 1024 * 25.4 / 96, 768 * 25.4 / 96);
+ gdk_monitor_set_scale_factor (display->monitor, 1);
}
static void
{
GdkBroadwayDisplay *broadway_display = GDK_BROADWAY_DISPLAY (display);
GdkMonitor *monitor;
- GdkRectangle size;
+ GdkRectangle current_size;
GList *toplevels, *l;
monitor = broadway_display->monitor;
- gdk_monitor_get_geometry (monitor, &size);
+ gdk_monitor_get_geometry (monitor, ¤t_size);
- if (msg->width == size.width && msg->height == size.height)
+ if (msg->width == current_size.width &&
+ msg->height == current_size.height &&
+ msg->scale == broadway_display->scale_factor)
return;
+ broadway_display->scale_factor = msg->scale;
+
gdk_monitor_set_size (monitor, msg->width, msg->height);
+ gdk_monitor_set_scale_factor (monitor, msg->scale);
gdk_monitor_set_physical_size (monitor, msg->width * 25.4 / 96, msg->height * 25.4 / 96);
toplevels = broadway_display->toplevels;
gdk_broadway_surface_move_resize (GDK_SURFACE (toplevel),
0, 0,
msg->width, msg->height);
- }
-}
+ }}
static GdkDevice *
create_core_pointer (GdkDisplay *display)
GdkKeymap *keymap;
GdkBroadwayServer *server;
-
gpointer move_resize_data;
GdkMonitor *monitor;
+ int scale_factor;
GHashTable *texture_cache;
_gdk_surface_clear_update_area (surface);
}
+static gint
+gdk_broadway_surface_get_scale_factor (GdkSurface *surface)
+{
+ GdkBroadwayDisplay *broadway_display;
+
+ if (GDK_SURFACE_DESTROYED (surface))
+ return 1;
+
+ broadway_display = GDK_BROADWAY_DISPLAY (gdk_surface_get_display (surface));
+
+ return broadway_display->scale_factor;
+}
+
static void
gdk_broadway_surface_move_resize_internal (GdkSurface *surface,
gboolean with_move,
impl_class->begin_move_drag = gdk_broadway_surface_begin_move_drag;
impl_class->destroy_notify = gdk_broadway_surface_destroy_notify;
impl_class->drag_begin = _gdk_broadway_surface_drag_begin;
+ impl_class->get_scale_factor = gdk_broadway_surface_get_scale_factor;
}
#define LAST_PROP 1
float offset_y)
{
GdkDisplay *display = gdk_surface_get_display (gsk_renderer_get_surface (renderer));
+ GdkBroadwayDisplay *broadway_display = GDK_BROADWAY_DISPLAY (display);
GskBroadwayRenderer *self = GSK_BROADWAY_RENDERER (renderer);
GArray *nodes = self->nodes;
int y = floorf (node->bounds.origin.y);
int width = ceil (node->bounds.origin.x + node->bounds.size.width) - x;
int height = ceil (node->bounds.origin.y + node->bounds.size.height) - y;
+ int scale = broadway_display->scale_factor;
- surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
+ surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width * scale, height * scale);
cr = cairo_create (surface);
+ cairo_scale (cr, scale, scale);
cairo_translate (cr, -x, -y);
gsk_render_node_draw (node, cr);
cairo_destroy (cr);
texture_id = gdk_broadway_display_ensure_texture (display, texture);
add_float (nodes, x - offset_x);
add_float (nodes, y - offset_y);
- add_float (nodes, gdk_texture_get_width (texture));
- add_float (nodes, gdk_texture_get_height (texture));
+ add_float (nodes, width);
+ add_float (nodes, height);
add_uint32 (nodes, texture_id);
}
}